In [1]:
%pylab inline
import ipywidgets as ipw
#from scipy import special
from scipy.special import jn,fresnel
%pylab is deprecated, use %matplotlib inline and import the required libraries. Populating the interactive namespace from numpy and matplotlib
Egyréses diffrakció -- Feynman pályákkal ¶
Az amplitudó:¶
\begin{align} U(\mathbf{R} ) &= \frac{k}{2\pi L}\,\sum_{\mathbf{r}\in S} e^{i k\left|\mathbf{R}-\mathbf{r}\right|}, \nonumber \\ I (\mathbf{R} ) &= {\left|U(\mathbf{R} )\right|}^2 , \nonumber \end{align}¶
ahol $\mathbf{R}$ az ernyő, $\mathbf{r}$ az $S$ rés egy pontja, $L$ a rés és az ernyő közti távolság, $k=2\pi/\lambda$ a hullámszám.¶
Egyréses diffrakció -- Fresnel-integrállal ¶
$U(x) = \frac{1}{\sqrt{2}}\, \left[F(\eta_+)-F(\eta_-) \right]$, ahol¶
$F(z)$ a Fresnel-integrál,¶
$\eta_\pm = \pm \sqrt{2N_F} \left(\frac{1}{2} \mp \frac{x}{a} \right)$, $N_F = \frac{a^2}{\lambda z}$ a Fresnel-szám, $a$ a rés szélessége, $z$ a rés és az ernyő távolsága.¶
In [2]:
def single_slit(x, F):
eta_p=sqrt(2*F)*(1/2-x)
eta_m=-sqrt(2*F)*(1/2+x)
sp,cp=fresnel(eta_p)
sm,cm=fresnel(eta_m)
tmp=(cp+1j*sp-(cm+1j*sm))/sqrt(2)
return(abs(tmp)**2)
In [3]:
## x --> ernyon a megfigyelesi pont helye
## L --> ernyon tavolsaga a restol
## a --> a res szelessege
## Nr --> a resen a pontok szama, igy a/Nr a resen beluli szomszedos pontok tavolsaga
## k --> a hullamszam, k = 2*pi/lambda
def slit_Feynman_sum(x,L,a,Nr, k):
xr = linspace(-a/2,a/2,Nr) ## resen beluli pont
RR = sqrt((xr[None,:]-x[:,None])**2+L**2)
dA = a/Nr*sqrt(k/(2*pi)/L) # normalas
Ap = sum(exp(1j*k*RR),axis=1) ## /Nr -- > normalas
#return array(abs(Ap*dA)**2),array([Ap])
return abs(Ap*dA)**2
def slit_Feynman_one(x,L,wr,Nr,k):
xr = linspace(-wr/2,wr/2,Nr) ## resen beluli pont
dA = wr/Nr*sqrt(k/(2*pi)/L) # normalas
Ap = []
for xxr in xr:
RR = sqrt((xxr-x)**2+L**2)
Ap.append(exp(1j*k*RR)*dA)
#return array(abs(Ap*dA)**2),array([Ap])
return Ap
In [4]:
# a very simple solution to vectorizing the heaviside function
# http://hplgit.github.io/primer.html/doc/pub/plot/._plot-solarized005.html
def stepfn(x):
return x >= 0
In [5]:
Nr=10
Dres, L, k = (1, 2, 100)
print('lambda = ',2*pi/k)
print('A resen beluli szomszedos pontok tavolsaga (<< lambda) = ',Dres/Nr)
# a bemeneti x egy array kell, hogy legyen ---> [2]
slit_Feynman_sum(array([2]),L,Dres,Nr,k) # x,L,Dres,Np, k
lambda = 0.06283185307179587 A resen beluli szomszedos pontok tavolsaga (<< lambda) = 0.1
Out[5]:
array([0.42480217])
In [ ]:
In [6]:
#xp=array([0.27])
xp =0.0 ## az ernyon egy pont
Nr = 100 ## Nr --> a resen a pontok szama, igy a/Nr
wr=1.0 ### a res szelessege m-ben
L = 20*wr # L, a res es az ernyo tavolsaga az 'wr' res szelessegenek egysegben
k= 2000 #### 2*pi/lam
Ap= slit_Feynman_one(xp,L,wr,Nr,k)
#Ap, real(Ap), imag(Ap)
lanc=cumsum(Ap,axis=0)
x,y=(real(lanc),imag(lanc))
#lanc,x,y
eredo = array([ x[-1]-x[0],y[-1]-y[0]])
N_F = round(k*wr/(2*pi)/L,2) ## Fresnel szam
fig, ax = plt.subplots(1, 1,figsize=(8,8))
ax.quiver(x[:-1], y[:-1], x[1:]-x[:-1], y[1:]-y[:-1], color='r',scale_units='xy', angles='xy', scale=1, width=0.0045)
# ez is kell helyes plottolashoz:
#plot(x[0],y[0], szin, lw=0.01)
ax.quiver(x[0],y[0],x[-1]-x[0],y[-1]-y[0], scale_units='xy', angles='xy', scale=1, width=0.005,color='k')
ax.set_title('xp = '+str(round(xp,1),) + ', N_F = '+str(round(N_F,2))+', |eredo| = '+ str(round(norm(eredo),3)))
ax.set_aspect('equal')
fact=1.1
ax.set_xlim(fact*min(x),fact*max(x))
ax.set_ylim(fact*min(y),fact*max(y))
print('eredo = ', eredo, norm(eredo))
grid()
eredo = [-0.29720677 0.82324172] 0.8752478517651563
In [7]:
@ipw.interact(xp=(-3,3,0.1),
L=(0.0,1000.0,10),
k=(0,20000.0,500),
wR=(0.,10.0,1.0),
Nr=(0,500,10))
def play(xp=0.0,L=20.0,k=2000.0,wR=2.0,Nr= 50):
wr=1.0 ### a res szelessege m-ben
Ap= slit_Feynman_one(xp,L,wr,Nr,k)
lanc=cumsum(Ap,axis=0)
x,y=(real(lanc),imag(lanc))
eredo = array([ x[-1]-x[0],y[-1]-y[0]])
N_F = round(k*wr/(2*pi)/L,2) ## Fresnel szam
fig, ax = plt.subplots(1, 1,figsize=(8,8))
ax.quiver(x[:-1], y[:-1], x[1:]-x[:-1], y[1:]-y[:-1], color='r',scale_units='xy', angles='xy', scale=1, width=0.0045)
# ez is kell helyes plottolashoz:
#plot(x[0],y[0], szin, lw=0.01)
ax.quiver(x[0],y[0],x[-1]-x[0],y[-1]-y[0], scale_units='xy', angles='xy', scale=1, width=0.005,color='k')
ax.set_title('xp = '+str(round(xp,1),) + ', N_F = '+str(round(N_F,2))+', |eredo| = '+ str(round(norm(eredo),3)))
ax.set_aspect('equal')
fact=1.2
ax.set_xlim(fact*min(x),fact*max(x))
ax.set_ylim(fact*min(y),fact*max(y))
print('eredo = ', eredo, norm(eredo))
grid()
interactive(children=(FloatSlider(value=0.0, description='xp', max=3.0, min=-3.0), FloatSlider(value=20.0, des…
In [ ]:
In [8]:
Nr = 300 ## Nr --> a resen a pontok szama, igy a/Nr
Np = 1000 ## Np --> az ernyon a pontok szama
### lam = 500*10**(-9), lambda m egysegben
wr=1.0 ### a=1*10**(-3), a res szelessege m-ben
L = 20*wr # L, a res es az ernyo tavolsaga az 'Dres' resszelesseg egysegben
k= 2000 #### 2*pi/lam
wr=1 ## a res merete = 1 and fix
N_F = round(k*wr/(2*pi)/L,2) ## Fresnel szam
print('Nr, a resen beluli pontok szama = ', Nr)
#print('lambda = ',round(lam*10**(9),1), ' nm')
print('A resen beluli szomszedos pontok tavolsaga (<< lambda) = ',round(wr/Np,2),' * lambda' )
print('Fresnel szám = ',N_F)
# ernyon levo pontok:
ernyo_meret= 2 *wr
x=linspace(-ernyo_meret/2,ernyo_meret/2,Np)
Ap2= slit_Feynman_sum(x,L,wr,Nr,k)
fig, ax = plt.subplots(1, 1,figsize=(8,8))
ax.plot(x/wr,Ap2, 'b-', lw=2, label=r'$\frac{a}{\lambda}= $' + str(round(k*wr/(2*pi),2))+' ,\n Feynman path' )
title('Fresnel-diffrakció egy résen, Fresnel-szám $N_F=a^2/(\lambda L)$ = '
+str(around(N_F,2)))
Um2_F = single_slit(x, N_F)
ax.plot(x,Um2_F,'r-', lw=2, dashes=(5, 10), label='Fresnel-integral')
#ax.plot(x/a,stepfn(1/2-x/a)*stepfn(x/a+1/2),'k--')
legend(loc='lower center',fontsize=10)
ax.set_xlabel(r'$x/a $',fontsize=15)
ax.axvline(-wr/2, color='k')
ax.axvline(wr/2, color='k')
#labels = [str(-ernyo_meret/Dres)+r' $\frac{D}{2}$',r'$-\frac{D}{2}$',r'$\frac{D}{2}$',str(ernyo_meret/Dres)+r'$\frac{D}{2}$']
#ax.set_xticks([-ernyo_meret/2,-Dres/2,Dres/2,ernyo_meret/2],labels,fontsize=16)
print('fifi = ',(ernyo_meret/Np)*k/(2*pi)/L)
grid()
Nr, a resen beluli pontok szama = 300 A resen beluli szomszedos pontok tavolsaga (<< lambda) = 0.0 * lambda Fresnel szám = 15.92 fifi = 0.03183098861837907
In [9]:
@ipw.interact(L=(0.0,1000.0,10),
k=(0,20000.0,200),
wR=(0.,10.0,1.0),
Nr=(0,500,10),
Np=(0,2000,100))
def play(L=20.0,k=2000.0,wR=2.0,Nr=300,Np=1000):
### 1D plot on the screen line defined by the array of xR and yR
wr=1 ## a res merete = 1 and fix
N_F = round(k*wr/(2*pi)/L,2) ## Fresnel szam
#xr=linspace(-wr/2,wr/2,Nr)
x=linspace(-wR/2,wR/2,Np)
Ap2= slit_Feynman_sum(x,L,wr,Nr,k)
fig, ax = plt.subplots(1, 1,figsize=(8,8))
ax.plot(x/wr,Ap2, 'b-', lw=2, label=r'$\frac{a}{\lambda}= $' + str(round(k*wr/(2*pi),2))+' ,\n Feynman path' )
title('Fresnel-diffrakció egy résen, Fresnel-szám $N_F=a^2/(\lambda L)$ = '
+str(around(N_F,2)))
Um2_F = single_slit(x, N_F)
ax.plot(x,Um2_F,'r-', lw=2, dashes=(5, 10), label='\nFresnel-integral')
#ax.plot(x/a,stepfn(1/2-x/a)*stepfn(x/a+1/2),'k--')
legend(loc='upper right',fontsize=10)
ax.set_xlabel(r'$x/a $',fontsize=15)
#ax.axvline(-1/2, color='k')
#ax.axvline(1/2, color='k')
print('Fresnel szam =',k/(2*pi)/L)
print('z_0/a = ',k/(pi))
grid()
interactive(children=(FloatSlider(value=20.0, description='L', max=1000.0, step=10.0), FloatSlider(value=2000.…
In [ ]:
VEGE¶
In [ ]: